package Calculadora.Stack.StackList;

/**
 * Elementos de una lista con enlace doble
 * @param <E>  clase generica
 * @author Douglas Dávila, Vinicio Gómez
 * @since 12/08/2012
 * @version 1.0
 */
public class DoublyLinkedListElement<E>{
    /**El dato almacenado*/
    protected E data;
    /**En enlace al siguiente elemento*/
    protected DoublyLinkedListElement nextData;
    /**En enlace al anterior elemento*/
    protected DoublyLinkedListElement previousData;

    /**
     * Constructor
     * @pre data es el dato a almacenar, nextData es la referencia a el siguiente objeto
     * @post Se crea una nueva cabeza en la lista
     * @param data el dato a almacenar en la lista
     * @param nextData La referencia al siguiente objeto en la lista
     * @param previousData La referencia al anterior objeto en la lista
     * @since 12/08/2012
     * @see SinglyLinkedList
     */
    public DoublyLinkedListElement(E data, DoublyLinkedListElement nextData, DoublyLinkedListElement previousData){
        this.data = data;
        this.nextData = nextData;
        if (this.nextData != null) {
            this.nextData.previousData = this;
        }
        this.previousData = previousData;
        if (this.previousData != null) {
            this.previousData.nextData = this;
        }
        
    }
    
    /**
     * Se obtiene la referendcia al siguiente objeto de la lista
     * @return la referencia al siguiente objeto de la lista
     * @pre n/a. Sera null en caso sea el ultimo
     * @post se retorna la referencia al siguiente objeto de la lista
     * @since 12/08/2012
     * @see DoublyLinkedList
     */
    public DoublyLinkedListElement next(){
        return nextData;
    }
    
    /**
     * Se obtiene el objeto almacenado al inicio de la lista
     * @return La referencia al objeto almacenado en la lista
     * @pre que la lista no este vacia
     * @post se retorna la referencia al primer objeto de la lista
     * @since 12/08/2012
     * @see DoublyLinkedList
     */
    public E value() {
        return data;
    }
    
    /**
     * Establecer la referencia al objeto anterior en la lista
     * @pre N/A
     * @post Se establecio la referencia al objeto anterior en la lista
     * @param previousData el objeto anterior en la lista
     * @since 12/08/2012
     * @see DoublyLinkedList
     */
    public void setPreviousData(DoublyLinkedListElement previousData){
        this.previousData = previousData;
    }

    /**
     * Establecer la referencia al objeto siguiente en la lista
     * @pre N/A
     * @post Se establecio la referencia al objeto siguiente en la lista
     * @param nextData el objeto siguiente en la lista
     * @since 12/08/2012
     * @see DoublyLinkedList
     */
    public void setNextData(DoublyLinkedListElement nextData){
        this.nextData = nextData;
    }
}  